/*
 * fml_TFT.c
 *
 *  Created on: 2025骞�4鏈�10鏃�
 *      Author: 22332
 */
#include <stdio.h>
#include "cola_init.h"
#include "cola_device.h"
#include "bsp_register_map.h"
#include "shell.h"
extern void logWrite(const char *fmt, ...);

static cola_device_t *g_pDev_tft_iic = NULL;
static uint8_t transmitBuffer[7U][5U] = {{0x50,0x00,0x00,0x60,0x08},
                                         {0x50,0x00,0x21,0x88,0x08},
                                         {0x50,0x00,0x21,0x8C,0x08},
                                         {0x50,0x00,0x22,0x5C,0x08},
                                         {0x50,0x00,0x22,0x68,0x08},
                                         {0x50,0x00,0x22,0x64,0x08},
                                         {0x50,0x00,0x22,0x58,0x08},
                                        };

static uint8_t First_Buffer[6] = {0xC8,0x00,0x58,0xA8,0X18,0X23};
static uint8_t Sec_Buffer[3] = {0x00,0x00,0x07};
static uint8_t Third_Buffer[3] = {0xFD,0x00,0xAA};
static uint8_t Forth_Buffer[3] = {0x49,0x00,0x80};

void fml_tft_init(void)
{
    g_pDev_tft_iic = cola_device_find("TFT_IIC");
}

uint8_t fml_tft_read_page_reg(uint8_t page,uint8_t reg)
{
	uint8_t pStartCmdSet[] = {0xC8,0x00,0x58,0xA8,0x18,0x01};
	uint8_t pPageSel[] = {0x00,0x00,page};
	uint8_t pPassWord[] = {0xFD,0x00,0xAA};
	uint16_t u16RegAddress = (reg<<8);
	uint8_t readValue = 0x00;
	cola_device_write(g_pDev_tft_iic,pStartCmdSet[0],pStartCmdSet+1,sizeof(pStartCmdSet)-1);
	cola_device_write(g_pDev_tft_iic,pPageSel[0],pPageSel+1,sizeof(pPageSel)-1);
	cola_device_write(g_pDev_tft_iic,pPassWord[0],pPassWord+1,sizeof(pPassWord)-1);
	cola_device_read(g_pDev_tft_iic,u16RegAddress,&readValue,1);
	logWrite("readValue=0x%02X\r\n",readValue);
	return readValue;
}


void fml_tft_BIST_clear(void)
{
	cola_device_write(g_pDev_tft_iic,First_Buffer[0],First_Buffer+1,5);
	cola_device_write(g_pDev_tft_iic,Sec_Buffer[0],Sec_Buffer+1,2);
	cola_device_write(g_pDev_tft_iic,Third_Buffer[0],Third_Buffer+1,2);
	Forth_Buffer[0] = 0x49;
	Forth_Buffer[2] = 0x07;
	cola_device_write(g_pDev_tft_iic,Forth_Buffer[0],Forth_Buffer+1,2);
	Forth_Buffer[0] = 0x4A;
	Forth_Buffer[2] = 0x03;
	cola_device_write(g_pDev_tft_iic,Forth_Buffer[0],Forth_Buffer+1,2);
	Forth_Buffer[0] = 0x4B;
	Forth_Buffer[2] = 0x00;
	cola_device_write(g_pDev_tft_iic,Forth_Buffer[0],Forth_Buffer+1,2);
	Forth_Buffer[0] = 0x4C;
	Forth_Buffer[2] = 0x00;
	cola_device_write(g_pDev_tft_iic,Forth_Buffer[0],Forth_Buffer+1,2);
	Forth_Buffer[0] = 0x60;
	Forth_Buffer[2] = 0x07;
	cola_device_write(g_pDev_tft_iic,Forth_Buffer[0],Forth_Buffer+1,2);

}
void fml_tft_write_BIST_mode(uint8_t mode)
{
	switch(mode)
	{
		case PTGN_RED://red
			Forth_Buffer[0] = 0x49;
			Forth_Buffer[2] = 0x87;
			break;
		case PTGN_WHITE://white
			Forth_Buffer[0] = 0x49;
			Forth_Buffer[2] = 0x47;
			break;
		case PTGN_BLACK://black
			Forth_Buffer[0] = 0x49;
			Forth_Buffer[2] = 0x27;
			break;
		case PTGN_CBAR_A://color bar pattern with 8-level-gray
			Forth_Buffer[0] = 0x4A;
			Forth_Buffer[2] = 0x83;
			break;
		case PTGN_BLUE://blue
			Forth_Buffer[0] = 0x4A;
			Forth_Buffer[2] = 0x43;
			break;
		case PTGN_GREEN://green
			Forth_Buffer[0] = 0x4A;
			Forth_Buffer[2] = 0x23;
			break;
		case PTGN_FLICKER://flicker
			Forth_Buffer[0] = 0x4B;
			Forth_Buffer[2] = 0x80;
			break;
		case PTGN_CROSS_B://Enable crosstalk pattern with gray code 0 (inside) and 186 (outside)
			Forth_Buffer[0] = 0x4B;
			Forth_Buffer[2] = 0x40;
			break;
		case PTGN_CROSS_A://Enable crosstalk pattern with gray code 255 (inside) and 186 (outside)
			Forth_Buffer[0] = 0x4B;
			Forth_Buffer[2] = 0x20;
			break;
		case PTGN_CHESS_B://chess-board pattern with 32x32 pixels
			Forth_Buffer[0] = 0x4B;
			Forth_Buffer[2] = 0x10;
			break;
		case PTGN_CHESS_A://64-block chess-board pattern
			Forth_Buffer[0] = 0x4B;
			Forth_Buffer[2] = 0x08;
			break;
		case PTGN_H_GRAY_B://256-level horizontal gray pattern
			Forth_Buffer[0] = 0x4B;
			Forth_Buffer[2] = 0x04;
			break;
		case PTGN_H_GRAY_A://16-level horizontal gray pattern
			Forth_Buffer[0] = 0x4B;
			Forth_Buffer[2] = 0x02;
			break;
		case PTGN_CBAR_B://8-color bar and 8-gray scale pattern
			Forth_Buffer[0] = 0x4B;
			Forth_Buffer[2] = 0x01;
			break;
		case PTGN_SPONOFF://sub-pixel on/off pattern
			Forth_Buffer[0] = 0x4C;
			Forth_Buffer[2] = 0x80;
			break;
		case PTGN_PONOFF://pixel on/off pattern
			Forth_Buffer[0] = 0x4C;
			Forth_Buffer[2] = 0x40;
			break;
		case PTGN_WFRAME_B://black ground and white frame pattern
			Forth_Buffer[0] = 0x4C;
			Forth_Buffer[2] = 0x20;
			break;
		case PTGN_WFRAME_A://black ground and white frame pattern with + symbo
			Forth_Buffer[0] = 0x4C;
			Forth_Buffer[2] = 0x10;
			break;
		case PTGN_GLEVEL://gray-level pattern
			Forth_Buffer[0] = 0x4C;
			Forth_Buffer[2] = 0x08;
			break;
		case PTGN_RGBW://RGBW pattern
			Forth_Buffer[0] = 0x4C;
			Forth_Buffer[2] = 0x04;
			break;
		case PTGN_V_GRAY_B://256-level vertical gray pattern
			Forth_Buffer[0] = 0x4C;
			Forth_Buffer[2] = 0x02;
			break;
		case PTGN_V_GRAY_A://16-level vertical gray pattern
			Forth_Buffer[0] = 0x4C;
			Forth_Buffer[2] = 0x01;
			break;
		case PTGN_H_BW_B://16-level vertical gray pattern
		    Forth_Buffer[0] = 0x60;
			Forth_Buffer[2] = 0x87;
			break;
		case PTGN_H_BW_A://16-level vertical gray pattern
			Forth_Buffer[0] = 0x60;
			Forth_Buffer[2] = 0x47;
			break;

		default:
		    break;
	}
	cola_device_write(g_pDev_tft_iic,First_Buffer[0],First_Buffer+1,5);
	cola_device_write(g_pDev_tft_iic,Sec_Buffer[0],Sec_Buffer+1,2);
	cola_device_write(g_pDev_tft_iic,Third_Buffer[0],Third_Buffer+1,2);
	cola_device_write(g_pDev_tft_iic,Forth_Buffer[0],Forth_Buffer+1,2);
}
int*  fml_tft_check_one_round(int event)
{
  //  uint64_t troubleCode = 0;
    static uint8_t status= 0;

    int buffer[32];
    int *result = buffer;
//    char *pTroubleCode = (char *)&troubleCode;
    if (g_pDev_tft_iic != NULL) {

            status = cola_device_write(g_pDev_tft_iic,0,transmitBuffer[event],0);
            if (status == 0x00)
            {
                cola_device_read(g_pDev_tft_iic,0,buffer,sizeof(buffer));
            }
    }
    return result;
}
uint8_t fml_tft_report_err_status(void)
{
    for (int i = 0; i < 7; i++)
    {
        int *result = fml_tft_check_one_round(i);
        switch (i)
        {
        case EVENT_TP:
            for (int i = 0; i < 32; i++)
            {
                switch (*(result+i))
                {
                case TP_WDT_ERROR:
                    /* code */
                    break;
                case TP_Configuration_CRC_Error:
                    /* code */
                    break;
                case TP_Sensor_open_short_test:
                    /* code */
                    break;
                case TP_Flash_load_CRC_Error:
                    /* code */
                    break;
                case TP_Flash_data_load_CRC_Error:
                    /* code */
                    break;
                default:
                    break;
                }
            }
            break;
        case EVENT_DCLK:
            for (int i = 0; i < 32; i++)
            {
                switch (*(result+i))
                {
                case DCLK_Detection_Port1:
                    /* code */
                    break;
                case DCLK_Detection_Port2:
                    /* code */
                    break;
                case DE_Detection:
                    /* code */
                    break;
                case Float_Detection_in_LVDS:

                	return 18;

                    /* code */
                    break;
                case SDNOFB_Feedback_STH_Detection:
                    /* code */
                    break;
                case GDNOFB_Feedback_STV_Detection:
                    /* code */
                    break;
                default:
                    break;
                }
            }
            break;
        case EVENT_HS:
            for (int i = 0; i < 32; i++)
            {
                switch (*(result+i))
                {
                case HS_Detection:
                    /* code */
                    break;
                case VS_Stop_Detection:
                    /* code */
                    break;
                case Data_CRC:
                    /* code */
                    break;
                default:
                    break;
                }
            }
            break;
        case EVENT_LOCK:
            for (int i = 0; i < 32; i++)
            {
                switch (*(result+i))
                {
                case LOCK_Detection_in_LVDS:
                    /* code */
                    break;
                case OEV_Stop_Detection:
                    /* code */
                    break;
                case POL_Stop_Detection:
                    /* code */
                    break;
                case GOA_ASIL_GOA_Detection_Feedback:
                    /* code */
                    break;
                default:
                    break;
                }
            }
            break;
        case EVENT_SD:
            for (int i = 0; i < 32; i++)
            {
                switch (*(result+i))
                {
                case EDT_PA_OVP_FLAG:
                    /* code */
                    break;
                case EDT_PA_UVP_FLAG:
                    /* code */
                    break;
                case EDT_NA_OVP_FLAG:
                    /* code */
                    break;
                case EDT_NA_UVP_FLAG:
                    /* code */
                    break;
                case EDT_VGH_OVP_FLAG:
                    /* code */
                    break;
                case EDT_VGH_UVP_FLAG:
                    /* code */
                    break;
                case EDT_VGL_OVP_FLAG:
                    /* code */
                    break;
                case EDT_VGL_UVP_FLAG:
                    /* code */
                    break;
                case EDT_VCOM_OVP_FLAG:
                    /* code */
                    break;
                case EDT_VCOM_UVP_FLAG:
                    /* code */
                    break;
                default:
                    break;
                }
            }
            break;
        case EVENT_POWER:
            for (int i = 0; i < 32; i++)
            {
                switch (*(result+i))
                {
                case STV_Detection:
                    /* code */
                    break;
                case CKV_Detection:
                    /* code */
                    break;
                default:
                    break;
                }
            }
                break;
        case EVENT_VDPA:
            for (int i = 0; i < 32; i++)
            {
                    switch (*(result+i))
                    {
                    case VDPA_VDNA_Fail_Ext:
                        /* code */
                        break;
                    case VDPA_VDNA_Fail_Int:
                        /* code */
                        break;
                    case EDT_VDNA_OCP_FLAG:
                        /* code */
                        break;
                    case EDT_VDPA_OCP_FLAG:
                        /* code */
                        break;
                    case Flash_Checksum_Detection:
                        /* code */
                        break;
                    case Register_Checksum_Detection:
                        /* code */
                        break;
                    case Thermal_Ultra_High_Detection:
                        /* code */
                        break;
                    case XON_Detection:
                        /* code */
                        break;
                    default:
                        break;
                    }
            }

                break;
            default:
                break;
        }
    }
    return 0;
}


